# Paquete para graficar la curva ROC
library(ROCR)
Loading required package: gplots
Attaching package: 'gplots'
The following object is masked from 'package:stats':
lowess
plotROC <- function(prediccion, real, adicionar = FALSE, color = "red") {
pred <- ROCR::prediction(prediccion, real)
perf <- ROCR::performance(pred, "tpr", "fpr")
plot(perf, col = color, add = adicionar, main = "Curva ROC")
segments(0, 0, 1, 1, col='black')
grid()
}
# Probamos la función
Score1 <- c(0.9, 0.9, 0.8, 0.5, 0.5, 0.4, 0.3, 0.1)
Clase1 <- c(1, 1, 1, 0, 1, 1, 0, 0)
plotROC(Score1, Clase1)
Score2 <- c(0.8, 0.8, 0.7, 0.5, 0.4, 0.3, 0.2, 0.1)
Clase2 <- c(1, 1, 1, 0, 1, 1, 0, 0)
plotROC(Score2, Clase2, adicionar = TRUE, color = "blue")
areaROC <- function(prediccion, real) {
pred <- ROCR::prediction(prediccion, real)
auc <- ROCR::performance(pred, "auc")
return(attributes(auc)$y.values[[1]])
}
areaROC(Score1, Clase1)
[1] 0.9
areaROC(Score2, Clase2)
[1] 0.8666667
library(traineR)
setwd("~/Google Drive/MDCurso/Datos")
suppressWarnings(suppressMessages(library(e1071)))
datos <- read.csv("MuestraCredito5000V2.csv",sep = ";",header=T)
# Recodifica las variables como categóricas ordinales
datos$IngresoNeto <- factor(datos$IngresoNeto,ordered = TRUE)
datos$CoefCreditoAvaluo <- factor(datos$CoefCreditoAvaluo,ordered = TRUE)
muestra <- sample(1:nrow(datos),floor(nrow(datos)*0.15))
ttesting <- datos[muestra,]
taprendizaje <- datos[-muestra,]
modelo <- train.svm(BuenPagador ~ ., data = taprendizaje)
# Así nos genera la probabilidad con type = "prob"
prediccion <- predict(modelo, ttesting, type = "prob")
head(prediccion$prediction)
No Si
3549 0.04246596 0.95753404
2375 0.92119416 0.07880584
2583 0.07642483 0.92357517
1553 0.04982807 0.95017193
4481 0.07226017 0.92773983
3013 0.07431079 0.92568921
Score <- prediccion$prediction[,2]
Clase <- ttesting$BuenPagador
# Genera el gráfico
plotROC(Score,Clase)
areaROC(Score,Clase)
[1] 0.7769271
Agregando otra curva ROC al mismo gráfico
Generamos otro modelo con kernel = “linear”
modelo2 <- train.svm(BuenPagador ~ ., data = taprendizaje, kernel = "linear")
prediccion2 <- predict(modelo2, ttesting, type = "prob")
head(prediccion2$prediction)
No Si
3549 0.006812977 0.9931870
2375 0.648328946 0.3516711
2583 0.101070982 0.8989290
1553 0.101047797 0.8989522
4481 0.101037640 0.8989624
3013 0.101014519 0.8989855
Score2 <- prediccion2$prediction[,2]
Clase2 <- ttesting$BuenPagador
plotROC(Score, Clase)
plotROC(Score2, Clase2, adicionar=TRUE, color = "blue")
areaROC(Score2, Clase2)
[1] 0.6911735
Agregando otra curva ROC al mismo gráfico
Generamos otro modelo con kernel = “sigmoid”
modelo3 <- train.svm(BuenPagador ~ ., data = taprendizaje, kernel = "sigmoid")
prediccion3 <- predict(modelo3, ttesting, type = "prob")
head(prediccion3$prediction)
No Si
3549 0.06606285 0.9339372
2375 0.21663263 0.7833674
2583 0.12418185 0.8758181
1553 0.13126162 0.8687384
4481 0.14106937 0.8589306
3013 0.13810626 0.8618937
Score3 <- prediccion3$prediction[,2]
Clase3 <- ttesting$BuenPagador
plotROC(Score, Clase)
plotROC(Score2, Clase2, adicionar = TRUE, color = "blue")
plotROC(Score3, Clase3, adicionar = TRUE, color = "green")
areaROC(Score3, Clase3)
[1] 0.578091
Agregando otra curva ROC al mismo gráfico con Árboles de Decisión
modelo <- train.rpart(BuenPagador~.,data = taprendizaje)
prediccion5 <- predict(modelo, ttesting, type = "prob")
head(prediccion5$prediction)
No Si
3549 0.15151515 0.84848485
2375 0.94620253 0.05379747
2583 0.02259887 0.97740113
1553 0.03079076 0.96920924
4481 0.03079076 0.96920924
3013 0.03079076 0.96920924
Score5 <- prediccion5$prediction[,2]
Clase5 <- ttesting$BuenPagador
plotROC(Score, Clase)
plotROC(Score2, Clase2, adicionar = TRUE, color = "blue")
plotROC(Score3, Clase3, adicionar = TRUE, color = "green")
plotROC(Score5, Clase5, adicionar = TRUE, color = "magenta")
areaROC(Score5, Clase5)
[1] 0.8884838
Sean \(f\) un modelo predictivo y \(y_i\) el score (puntaje o probabilidad) para la observación o individuo \(x_i\) dado por el modelo \(f\), es decir, \(y_i = f(x_i)\).
Sea \(T\) un umbral (threshold) entonces tenemos la regla asignación siguiente:
La idea es ir variando el umbral e ir aplicando la regla de asignación con dicho umbral, luego formar la matriz de confusión y calular las tasas de Verdaderos Positivos y Faltos negativos, y por último ubicar dicho punto en el gráfico. Y así sucesivamente hasta formar toda la curva.
Notemos que el umbral 1 corresponde al punto (0, 0) en la curva ROC, esto pues al fijar el umbral como 1 todas las observaciones serán clasificadas como Negativas, y por tanto las tasas de Verdaderos Positivos y Falsos Positivos son ambas 0. De forma análoga el umbral 0 corresponde al punto (1, 1) en la curava ROC.
Por lo anterior hacemos variar el umbral de 1 hasta 0, notando que para un modelo \(f\) cada umbral \(T\) genera un punto en el espacio de la curva ROC.
Veamos el siguiente ejemplo.
| Individuo | Clase | Score | Individuo | Clase | Score | |
|---|---|---|---|---|---|---|
| 1 | p | 0.550 | 11 | n | 0.33 | |
| 2 | n | 0.390 | 12 | p | 0.38 | |
| 3 | n | 0.530 | 13 | p | 0.51 | |
| 4 | p | 0.600 | 14 | n | 0.10 | |
| 5 | n | 0.505 | 15 | p | 0.80 | |
| 6 | n | 0.520 | 16 | n | 0.37 | |
| 7 | p | 0.400 | 17 | p | 0.30 | |
| 8 | n | 0.360 | 18 | p | 0.90 | |
| 9 | p | 0.340 | 19 | n | 0.70 | |
| 10 | n | 0.350 | 20 | p | 0.54 |
Usamos el paquete ROCR para generar la curva, posteriormente graficamos los puntos calculados de la manera explicada anteriormente.
library(ROCR)
Clase <- c(1, 0, 0, 1, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 0, 0, 1)
Score <- c(0.6, 0.35, 0.53, 0.54, 0.505, 0.3, 0.8, 0.1, 0.33, 0.39, 0.34, 0.55, 0.51, 0.38, 0.36, 0.52, 0.9, 0.7, 0.37, 0.4)
# Graficamos ROC con funciones de paquete ROCR
plotROC(Score, Clase)
# Graficamos puntos con algoritmo
i <- 1 # Contador
FP_r <- -1 # Para que entre al condicional en la primera iteración
TP_r <- -1 # Para que entre al condicional en la primera iteración
for(Umbral in seq(1, 0, by = -0.005)) {
Prediccion <- ifelse(Score >= Umbral, 1, 0)
MC <- table(Clase, Pred = factor(Prediccion, levels = c(0, 1)))
# Condicional para no imprimir puntos repetidos
if(FP_r != MC[1, 2] / sum(MC[1, ]) | TP_r != MC[2, 2] / sum(MC[2, ])) {
FP_r <- MC[1, 2] / sum(MC[1, ]) # Tasa de Falsos Positivos
TP_r <- MC[2, 2] / sum(MC[2, ]) # Tasa de Verdaderos Positivos
# Graficamos punto
points(FP_r, TP_r, col = "blue")
text(FP_r + 0.02, TP_r - 0.02, Umbral)
# Imprimimos resultados
cat("Punto i = ", i, "\n")
cat("Umbral = T = ", Umbral, "\n")
cat("MC = \n")
print(MC)
cat("Tasa FP = ", round(FP_r, 2), "\n")
cat("Tasa TP = ", round(TP_r, 2), "\n")
cat("\n")
i <- i + 1 # Aumentamos contador
}
}
## Punto i = 1
## Umbral = T = 1
## MC =
## Pred
## Clase 0 1
## 0 10 0
## 1 10 0
## Tasa FP = 0
## Tasa TP = 0
##
## Punto i = 2
## Umbral = T = 0.9
## MC =
## Pred
## Clase 0 1
## 0 10 0
## 1 9 1
## Tasa FP = 0
## Tasa TP = 0.1
##
## Punto i = 3
## Umbral = T = 0.8
## MC =
## Pred
## Clase 0 1
## 0 10 0
## 1 8 2
## Tasa FP = 0
## Tasa TP = 0.2
##
## Punto i = 4
## Umbral = T = 0.7
## MC =
## Pred
## Clase 0 1
## 0 9 1
## 1 8 2
## Tasa FP = 0.1
## Tasa TP = 0.2
##
## Punto i = 5
## Umbral = T = 0.6
## MC =
## Pred
## Clase 0 1
## 0 9 1
## 1 7 3
## Tasa FP = 0.1
## Tasa TP = 0.3
##
## Punto i = 6
## Umbral = T = 0.55
## MC =
## Pred
## Clase 0 1
## 0 9 1
## 1 6 4
## Tasa FP = 0.1
## Tasa TP = 0.4
##
## Punto i = 7
## Umbral = T = 0.54
## MC =
## Pred
## Clase 0 1
## 0 9 1
## 1 5 5
## Tasa FP = 0.1
## Tasa TP = 0.5
##
## Punto i = 8
## Umbral = T = 0.53
## MC =
## Pred
## Clase 0 1
## 0 8 2
## 1 5 5
## Tasa FP = 0.2
## Tasa TP = 0.5
##
## Punto i = 9
## Umbral = T = 0.52
## MC =
## Pred
## Clase 0 1
## 0 7 3
## 1 5 5
## Tasa FP = 0.3
## Tasa TP = 0.5
##
## Punto i = 10
## Umbral = T = 0.51
## MC =
## Pred
## Clase 0 1
## 0 7 3
## 1 4 6
## Tasa FP = 0.3
## Tasa TP = 0.6
##
## Punto i = 11
## Umbral = T = 0.505
## MC =
## Pred
## Clase 0 1
## 0 6 4
## 1 4 6
## Tasa FP = 0.4
## Tasa TP = 0.6
##
## Punto i = 12
## Umbral = T = 0.4
## MC =
## Pred
## Clase 0 1
## 0 6 4
## 1 3 7
## Tasa FP = 0.4
## Tasa TP = 0.7
##
## Punto i = 13
## Umbral = T = 0.39
## MC =
## Pred
## Clase 0 1
## 0 5 5
## 1 3 7
## Tasa FP = 0.5
## Tasa TP = 0.7
##
## Punto i = 14
## Umbral = T = 0.38
## MC =
## Pred
## Clase 0 1
## 0 5 5
## 1 2 8
## Tasa FP = 0.5
## Tasa TP = 0.8
##
## Punto i = 15
## Umbral = T = 0.37
## MC =
## Pred
## Clase 0 1
## 0 4 6
## 1 2 8
## Tasa FP = 0.6
## Tasa TP = 0.8
##
## Punto i = 16
## Umbral = T = 0.36
## MC =
## Pred
## Clase 0 1
## 0 3 7
## 1 2 8
## Tasa FP = 0.7
## Tasa TP = 0.8
##
## Punto i = 17
## Umbral = T = 0.35
## MC =
## Pred
## Clase 0 1
## 0 2 8
## 1 2 8
## Tasa FP = 0.8
## Tasa TP = 0.8
##
## Punto i = 18
## Umbral = T = 0.34
## MC =
## Pred
## Clase 0 1
## 0 2 8
## 1 1 9
## Tasa FP = 0.8
## Tasa TP = 0.9
##
## Punto i = 19
## Umbral = T = 0.33
## MC =
## Pred
## Clase 0 1
## 0 1 9
## 1 1 9
## Tasa FP = 0.9
## Tasa TP = 0.9
##
## Punto i = 20
## Umbral = T = 0.3
## MC =
## Pred
## Clase 0 1
## 0 1 9
## 1 0 10
## Tasa FP = 0.9
## Tasa TP = 1
##
## Punto i = 21
## Umbral = T = 0.1
## MC =
## Pred
## Clase 0 1
## 0 0 10
## 1 0 10
## Tasa FP = 1
## Tasa TP = 1
Si bien es cierto el cálculo anterior es bastante claro, éste puede ser un poco extenso pues en cada iteración se deben considerar todos los individuos o filas.
Por esta razón se plantea el siguiente algortimo que es computacionalmente más eficiente. Para este algoritmo se requiere ordenar la tabla de datos de forma descendente según el score.
| Individuo | Clase | Score | Individuo | Clase | Score | |
|---|---|---|---|---|---|---|
| 18 | p | 0.900 | 7 | p | 0.40 | |
| 15 | p | 0.800 | 2 | n | 0.39 | |
| 19 | n | 0.700 | 12 | p | 0.38 | |
| 4 | p | 0.600 | 16 | n | 0.37 | |
| 1 | p | 0.550 | 8 | n | 0.36 | |
| 20 | p | 0.540 | 10 | n | 0.35 | |
| 3 | n | 0.530 | 9 | p | 0.34 | |
| 6 | n | 0.520 | 11 | n | 0.33 | |
| 13 | p | 0.510 | 17 | p | 0.30 | |
| 5 | n | 0.505 | 14 | n | 0.10 |
N=10
P=10
Primer Punto
T=0.05
Para i=1
0.9 > T y class=p => TP=1
FP=0
TP=1
FP/10=0
TP/10=0.1
Punto=(0,0.1)
Segundo Punto
T=0.1
Para i=2
0.9 > T y class=p => TP=1
0.8 > T y class=p => TP=2
FP=0
TP=2
FP/10=0
TP/10=0.2
Punto=(0,0.2)
Tercer Punto
T=0.15
Para i=3
0.9 > T y class=p => TP=1
0.8 > T y class=p => TP=2
0.7 > T y class=n => FP=1
FP=1
TP=2
FP/10=0.1
TP/10=0.2
Punto=(0.1,0.2)
Cuarto Punto
T=0.20
Para i=4
0.9 > T y class=p => TP=1
0.8 > T y class=p => TP=2
0.7 > T y class=n => FP=1
0.6 > T y class=p => TP=3
FP=1
TP=3
FP/10=0.1
TP/10=0.3
Punto=(0.1,0.3)
Quinto Punto
T=0.25
Para i=5
0.9 > T y class=p => TP=1
0.8 > T y class=p => TP=2
0.7 > T y class=n => FP=1
0.6 > T y class=p => TP=3
0.55 > T y class=p => TP=4
FP=1
TP=4
FP/10=0.1
TP/10=0.4
Punto=(0.1,0.4)
Sexto Punto
T=0.30
Para i=6
0.9 > T y class=p => TP=1
0.8 > T y class=p=> TP=2
0.7 > T y class=n => FP=1
0.6 > T y class=p => TP=3
0.55 > T y class=p => TP=4
0.54 > T y class=p => TP=5
FP=1
TP=5
FP/10=0.1
TP/10=0.5
Punto=(0.1,0.5)
Séptimo Punto
T=0.35
Para i=7
0.9 > T y class=p => TP=1
0.8 > T y class=p => TP=2
0.7 > T y class=n => FP=1
0.6 > T y class=p => TP=3
0.55 > T y class=p => TP=4
0.54 > T y class=p => TP=5
0.53 > T y class=n => FP=2
FP=2
TP=5
FP/10=0.2
TP/10=0.5
Punto=(0.2,0.5)
Octavo Punto
T=0.4
Para i=8
0.9 > T y class=p => TP=1
0.8 > T y class=p => TP=2
0.7 > T y class=n => FP=1
0.6 > T y class=p => TP=3
0.55 > T y class=p => TP=4
0.54 > T y class=p => TP=5
0.53 > T y class=n => FP=2
0.52 > T y class=n => FP=3
FP=3
TP=5
FP/10=0.3
TP/10=0.5
Punto=(0.3,0.5)
Noveno Punto
T=0.45
Para i=9
0.9 > T y class=p => TP=1
0.8 > T y class=p => TP=2
0.7 > T y class=n => FP=1
0.6 > T y class=p => TP=3
0.55 > T y class=p => TP=4
0.54 > T y class=p => TP=5
0.53 > T y class=n => FP=2
0.52 > T y class=n => FP=3
0.51 > T y class=p => TP=6
FP=3
TP=6
FP/10=0.3
TP/10=0.6
Punto=(0.3,0.6)
Décimo Punto
T=0.5
Para i=10
0.9 > T y class=p => TP=1
0.8 > T y class=p => TP=2
0.7 > T y class=n => FP=1
0.6 > T y class=p => TP=3
0.55 > T y class=p => TP=4
0.54 > T y class=p => TP=5
0.53 > T y class=n => FP=2
0.52 > T y class=n => FP=3
0.51 > T y class=p => TP=6
0.505 > T y class=n => FP=4
FP=4
TP=6
FP/10=0.4
TP/10=0.6
Punto=(0.4,0.6)
Onceavo Punto
T=0.55
Para i=11
0.9 > T y class=p => TP=1
0.8 > T y class=p => TP=2
0.7 > T y class=n => FP=1
0.6 > T y class=p => TP=3
EL SIGUIENTE CÁLCULO ES CORRECTO
PERO NO ÚTIL PARA LA CURVA ROC
PORQUE LA CURVA ROC GRAFICA TP vs FP
0.55 > T y class=p => FN=1
0.54 > T y class=p => FN=2
0.53 > T y class=n => TN=1
0.52 > T y class=n => TN=2
0.51 > T y class=p => FN=3
0.505 > T y class=n => TN=3
0.4 > T y class=p => FN=4
ES EQUIVALENTE INVERTIR LA DESIGUALDAD > POR <=
Y ASÍ INCREMENTAR “FN” PARA EFECTOS DEL CONTEO ES EQUIVALENTE A INCREMENTAR “TP”
E INCREMENTAR “TN” PARA EFECTOS DEL CONTEO ES EQUIVALENTE A INCREMENTAR “FP”
0.55 <= T y class=p => TP=4
0.54 <= T y class=p => TP=5
0.53 <= T y class=n => FP=2
0.52 <= T y class=n => FP=3
0.51 <= T y class=p => TP=6
0.505 <= T y class=n => FP=4
0.4 <= T y class=p => TP=7
FP=4
TP=7
FP/10=0.4
TP/10=0.7
Punto=(0.4,0.7)
Doceavo Punto
T=0.6
Para i=12
0.9 > T y class=p => TP=1
0.8 > T y class=p => TP=2
0.7 > T y class=n => FP=1
SE DEBE INVERTIR LA DESIGUALDAD > POR <=
Y ASÍ INCREMENTAR “FN” PARA EFECTOS DEL CONTEO ES EQUIVALENTE A INCREMENTAR “TP”
E INCREMENTAR “TN” PARA EFECTOS DEL CONTEO ES EQUIVALENTE A INCREMENTAR “FP”
0.6 <= T y class=p => TP=3
0.55 <= T y class=p => TP=4
0.54 <= T y class=p => TP=5
0.53 <= T y class=n => FP=2
0.52 <= T y class=n => FP=3
0.51 <= T y class=p => TP=6
0.505 <= T y class=n => FP=4
0.4 <= T y class=p => TP=7
0.39 <= T y class=n => FP=5
FP=5
TP=7
FP/10=0.5
TP/10=0.7
Punto=(0.5,0.7)
Treceavo Punto
T=0.65
Para i=13
0.9 > T y class=p => TP=1
0.8 > T y class=p => TP=2
0.7 > T y class=n => FP=1
SE DEBE INVERTIR LA DESIGUALDAD > POR <=
Y ASÍ INCREMENTAR “FN” PARA EFECTOS DEL CONTEO ES EQUIVALENTE A INCREMENTAR “TP”
E INCREMENTAR “TN” PARA EFECTOS DEL CONTEO ES EQUIVALENTE A INCREMENTAR “FP”
0.6 <= T y class=p => TP=3
0.55 <= T y class=p => TP=4
0.54 <= T y class=p => TP=5
0.53 <= T y class=n => FP=2
0.52 <= T y class=n => FP=3
0.51 <= T y class=p => TP=6
0.505 <= T y class=n => FP=4
0.4 <= T y class=p => TP=7
0.39 <= T y class=n => FP=5
0.38 <= T y class=p => TP=8
FP=5
TP=8
FP/10=0.5
TP/10=0.8
Punto=(0.5,0.8)
Catorceavo Punto
T=0.70
Para i=14
0.9 > T y class=p => TP=1
0.8 > T y class=p => TP=2
SE DEBE INVERTIR LA DESIGUALDAD > POR <=
Y ASÍ INCREMENTAR “FN” PARA EFECTOS DEL CONTEO ES EQUIVALENTE A INCREMENTAR “TP”
E INCREMENTAR “TN” PARA EFECTOS DEL CONTEO ES EQUIVALENTE A INCREMENTAR “FP”
0.7 <= T y class=n => FP=1
0.6 <= T y class=p => TP=3
0.55 <= T y class=p => TP=4
0.54 <= T y class=p => TP=5
0.53 <= T y class=n => FP=2
0.52 <= T y class=n => FP=3
0.51 <= T y class=p => TP=6
0.505 <= T y class=n => FP=4
0.4 <= T y class=p => TP=7
0.39 <= T y class=n => FP=5
0.38 <= T y class=p => TP=8
0.37 <= T y class=n => FP=6
FP=6
TP=8
FP/10=0.6
TP/10=0.8
Punto=(0.6,0.8)
Quinceavo Punto
T=0.75
Para i=15
0.9 > T y class=p => TP=1
0.8 > T y class=p => TP=2
SE DEBE INVERTIR LA DESIGUALDAD > POR <=
Y ASÍ INCREMENTAR “FN” PARA EFECTOS DEL CONTEO ES EQUIVALENTE A INCREMENTAR “TP”
E INCREMENTAR “TN” PARA EFECTOS DEL CONTEO ES EQUIVALENTE A INCREMENTAR “FP”
0.7 <= T y class=n => FP=1
0.6 <= T y class=p => TP=3
0.55 <= T y class=p => TP=4
0.54 <= T y class=p => TP=5
0.53 <= T y class=n => FP=2
0.52 <= T y class=n => FP=3
0.51 <= T y class=p => TP=6
0.505 <= T y class=n => FP=4
0.4 <= T y class=p => TP=7
0.39 <= T y class=n => FP=5
0.38 <= T y class=p => TP=8
0.37 <= T y class=n => FP=6
0.36 <= T y class=n => FP=7
FP=7
TP=8
FP/10=0.7
TP/10=0.8
Punto=(0.7,0.8)
Dieciseisavo Punto
T=0.80
Para i=16
0.9 > T y class=p => TP=1
SE DEBE INVERTIR LA DESIGUALDAD > POR <=
Y ASÍ INCREMENTAR “FN” PARA EFECTOS DEL CONTEO ES EQUIVALENTE A INCREMENTAR “TP”
E INCREMENTAR “TN” PARA EFECTOS DEL CONTEO ES EQUIVALENTE A INCREMENTAR “FP”
0.8 <= T y class=p => TP=2
0.7 <= T y class=n => FP=1
0.6 <= T y class=p => TP=3
0.55 <= T y class=p => TP=4
0.54 <= T y class=p => TP=5
0.53 <= T y class=n => FP=2
0.52 <= T y class=n => FP=3
0.51 <= T y class=p => TP=6
0.505 <= T y class=n => FP=4
0.4 <= T y class=p => TP=7
0.39 <= T y class=n => FP=5
0.38 <= T y class=p => TP=8
0.37 <= T y class=n => FP=6
0.36 <= T y class=n => FP=7
0.35 <= T y class=n => FP=8
FP=8
TP=8
FP/10=0.8
TP/10=0.8
Punto=(0.8,0.8)
Dieciseitavo Punto
T=0.85
Para i=17
0.9 > T y class=p => TP=1
SE DEBE INVERTIR LA DESIGUALDAD > POR <=
Y ASÍ INCREMENTAR “FN” PARA EFECTOS DEL CONTEO ES EQUIVALENTE A INCREMENTAR “TP”
E INCREMENTAR “TN” PARA EFECTOS DEL CONTEO ES EQUIVALENTE A INCREMENTAR “FP”
0.8 <= T y class=p => TP=2
0.7 <= T y class=n => FP=1
0.6 <= T y class=p => TP=3
0.55 <= T y class=p => TP=4
0.54 <= T y class=p => TP=5
0.53 <= T y class=n => FP=2
0.52 <= T y class=n => FP=3
0.51 <= T y class=p => TP=6
0.505 <= T y class=n => FP=4
0.4 <= T y class=p => TP=7
0.39 <= T y class=n => FP=5
0.38 <= T y class=p => TP=8
0.37 <= T y class=n => FP=6
0.36 <= T y class=n => FP=7
0.35 <= T y class=n => FP=8
0.34 <= T y class=p => TP=9
FP=8
TP=9
FP/10=0.8
TP/10=0.9
Punto=(0.8,0.9)
Dieciochavo Punto
T=0.90
Para i=18
SE DEBE INVERTIR LA DESIGUALDAD > POR <=
Y ASÍ INCREMENTAR “FN” PARA EFECTOS DEL CONTEO ES EQUIVALENTE A INCREMENTAR “TP”
E INCREMENTAR “TN” PARA EFECTOS DEL CONTEO ES EQUIVALENTE A INCREMENTAR “FP”
0.9 <= T y class=p => TP=1
0.8 <= T y class=p => TP=2
0.7 <= T y class=n => FP=1
0.6 <= T y class=p => TP=3
0.55 <= T y class=p => TP=4
0.54 <= T y class=p => TP=5
0.53 <= T y class=n => FP=2
0.52 <= T y class=n => FP=3
0.51 <= T y class=p => TP=6
0.505 <= T y class=n => FP=4
0.4 <= T y class=p => TP=7
0.39 <= T y class=n => FP=5
0.38 <= T y class=p => TP=8
0.37 <= T y class=n => FP=6
0.36 <= T y class=n => FP=7
0.35 <= T y class=n => FP=8
0.34 <= T y class=p => TP=9
0.33 <= T y class=n => FP=9
FP=9
TP=9
FP/10=0.9
TP/10=0.9
Punto=(0.9,0.9)
Dicimonoveno Punto
T=0.95
Para i=19
0.9 <= T y class=p => TP=1
0.8 <= T y class=p => TP=2
0.7 <= T y class=n => FP=1
0.6 <= T y class=p => TP=3
0.55 <= T y class=p => TP=4
0.54 <= T y class=p => TP=5
0.53 <= T y class=n => FP=2
0.52 <= T y class=n => FP=3
0.51 <= T y class=p => TP=6
0.505 <= T y class=n => FP=4
0.4 <= T y class=p => TP=7
0.39 <= T y class=n => FP=5
0.38 <= T y class=p => TP=8
0.37 <= T y class=n => FP=6
0.36 <= T y class=n => FP=7
0.35 <= T y class=n => FP=8
0.34 <= T y class=p => TP=9
0.33 <= T y class=n => FP=9
0.30 <= T y class=p => TP=10
FP=9
TP=10
FP/10=0.9
TP/10=10
Punto=(0.9,1)
Veinteavo Punto
T=0.1
Para i=20
0.9 <= T y class=p => TP=1
0.8 <= T y class=p => TP=2
0.7 <= T y class=n => FP=1
0.6 <= T y class=p => TP=3
0.55 <= T y class=p => TP=4
0.54 <= T y class=p => TP=5
0.53 <= T y class=n => FP=2
0.52 <= T y class=n => FP=3
0.51 <= T y class=p => TP=6
0.505 <= T y class=n => FP=4
0.4 <= T y class=p => TP=7
0.39 <= T y class=n => FP=5
0.38 <= T y class=p => TP=8
0.37 <= T y class=n => FP=6
0.36 <= T y class=n => FP=7
0.35 <= T y class=n => FP=8
0.34 <= T y class=p => TP=9
0.33 <= T y class=n => FP=9
0.30 <= T y class=p => TP=10
0.1 <= T y class=n => FP=10
FP=10
TP=10
FP/10=10
TP/10=10
Punto=(1,1)
Veamos el código que implementa el algorimo eficiente.
Clase <- c(1, 1, 0, 1, 1, 1, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0)
Score <- c(.9, .8, .7, .6, .55, .54, .53, .52, .51, .505, .4, .39, .38, .37, .36, .35, .34, .33, .30, .1)
plotROC(Score, Clase)
Umbral<-min(Score)
Paso <- (max(Score) - min(Score)) / 20
N <- 10 # ceros
P <- 10 # unos
TP <- 0
FP <- 0
for(i in 1:20) {
if(Score[i] > Umbral)
if(Clase[i] == 1)
TP <- TP + 1
else
FP <- FP + 1
else
if(Clase[i] == 0)
FP <- FP + 1
else
TP <- TP + 1
# Graficamos punto
points(FP / N, TP / P, col = "blue")
text(FP / N + 0.02, TP / P - 0.02, i)
Umbral <- Umbral + Paso
}
Ejemplo Paso a Paso (deben estar ordenados en sentido decreciente)
Inicializado para que dé igual a la corrida a pie
Clase <- c(1, 1, 0, 1, 1, 1, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0)
Score <- c(.9, .8, .7, .6, .55, .54, .53, .52, .51, .505, .4, .39, .38, .37, .36, .35, .34, .33, .30, .1)
plotROC(Score, Clase)
# Aquí se inicializan para que dé igual a la corrida a pie
Umbral <- 0.05
Paso <- 0.05
N <- 10 # ceros
P <- 10 # unos
TP <- 0
FP <- 0
for(i in 1:20) {
if(Score[i] > Umbral)
if(Clase[i] == 1)
TP <- TP + 1
else
FP <- FP + 1
else
if(Clase[i] == 0)
FP <- FP + 1
else
TP <- TP + 1
# Graficamos punto
points(FP / N, TP / P, col = "blue")
text(FP / N + 0.02, TP/P - 0.02, round(Umbral, 2))
# Imprimimos resultado
cat("Punto i = ", i, "\n")
cat("Umbral = T = ", Umbral, "\n")
cat("FP/N = ", round(FP / N, 2), "\n")
cat("TP/P = ", round(TP / P, 2), "\n")
cat("\n")
Umbral <- Umbral + Paso
}
Punto i = 1
Umbral = T = 0.05
FP/N = 0
TP/P = 0.1
Punto i = 2
Umbral = T = 0.1
FP/N = 0
TP/P = 0.2
Punto i = 3
Umbral = T = 0.15
FP/N = 0.1
TP/P = 0.2
Punto i = 4
Umbral = T = 0.2
FP/N = 0.1
TP/P = 0.3
Punto i = 5
Umbral = T = 0.25
FP/N = 0.1
TP/P = 0.4
Punto i = 6
Umbral = T = 0.3
FP/N = 0.1
TP/P = 0.5
Punto i = 7
Umbral = T = 0.35
FP/N = 0.2
TP/P = 0.5
Punto i = 8
Umbral = T = 0.4
FP/N = 0.3
TP/P = 0.5
Punto i = 9
Umbral = T = 0.45
FP/N = 0.3
TP/P = 0.6
Punto i = 10
Umbral = T = 0.5
FP/N = 0.4
TP/P = 0.6
Punto i = 11
Umbral = T = 0.55
FP/N = 0.4
TP/P = 0.7
Punto i = 12
Umbral = T = 0.6
FP/N = 0.5
TP/P = 0.7
Punto i = 13
Umbral = T = 0.65
FP/N = 0.5
TP/P = 0.8
Punto i = 14
Umbral = T = 0.7
FP/N = 0.6
TP/P = 0.8
Punto i = 15
Umbral = T = 0.75
FP/N = 0.7
TP/P = 0.8
Punto i = 16
Umbral = T = 0.8
FP/N = 0.8
TP/P = 0.8
Punto i = 17
Umbral = T = 0.85
FP/N = 0.8
TP/P = 0.9
Punto i = 18
Umbral = T = 0.9
FP/N = 0.9
TP/P = 0.9
Punto i = 19
Umbral = T = 0.95
FP/N = 0.9
TP/P = 1
Punto i = 20
Umbral = T = 1
FP/N = 1
TP/P = 1